//
//  CustomBottomSheetModifier.swift
//  GithubUserSet
//
//  Created by Golden Jellyfish on 2025/9/4.
//
/*
import SwiftUI

// 1. 创建 ViewModifier 结构体
struct CustomBottomSheetModifier<SheetContent: View>: ViewModifier {
    
    // 绑定一个布尔值来控制显示/隐藏
    @Binding var isPresented: Bool
    // 使用 @ViewBuilder 来接收弹框的视图内容
    let sheetContent: () -> SheetContent
    
    func body(content: Content) -> some View {
        ZStack {
            // 这是我们的主视图内容
            content
            
            // 当 isPresented 为 true 时，显示遮罩和弹框
            if isPresented {
                // 半透明的遮罩层
                Color.black.opacity(0.4)
                    .ignoresSafeArea()
                    .onTapGesture {
                        // 点击遮罩时，关闭弹框（带动画）
                        withAnimation {
                            isPresented = false
                        }
                    }
                
                // 弹框内容
                VStack {
                    // 用 Spacer 把内容推到底部
                    Spacer()
                    
                    // 我们传入的自定义视图内容
                    sheetContent()
                        .background(Color(.systemBackground)) // 适配深色模式的背景
                        .cornerRadius(16, corners: [.topLeft, .topRight]) // 只给顶部加圆角
                        .transition(.move(edge: .bottom)) // 从底部滑入的动画
                }
                .ignoresSafeArea(edges: .bottom) // 让弹框延伸到底部安全区外
            }
        }
    }
}

// 2. 创建一个 View 的扩展，让调用更方便
extension View {
    func customBottomSheet<Content: View>(isPresented: Binding<Bool>, @ViewBuilder content: @escaping () -> Content) -> some View {
        self.modifier(CustomBottomSheetModifier(isPresented: isPresented, sheetContent: content))
    }
}

// 3. 一个辅助工具，用于给指定的角设置圆角
extension View {
    func cornerRadius(_ radius: CGFloat, corners: UIRectCorner) -> some View {
        clipShape(RoundedCorner(radius: radius, corners: corners))
    }
}

struct RoundedCorner: Shape {
    var radius: CGFloat = .infinity
    var corners: UIRectCorner = .allCorners

    func path(in rect: CGRect) -> Path {
        let path = UIBezierPath(roundedRect: rect, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        return Path(path.cgPath)
    }
}
 */

/*
import SwiftUI

// 我们需要定义一个常量来控制头部视图（图标）的高度，以便计算
private let HEADER_VIEW_HEIGHT: CGFloat = 50

struct CustomBottomSheetModifier<SheetContent: View, HeaderContent: View>: ViewModifier {
    
    @Binding var isPresented: Bool
    // 我们现在接收两个 ViewBuilder，一个用于头部，一个用于内容
    let headerContent: () -> HeaderContent
    let sheetContent: () -> SheetContent
    
    func body(content: Content) -> some View {
        ZStack {
            content // 主视图
            
            if isPresented {
                // 遮罩层 (不变)
                Color.black.opacity(0.4)
                    .ignoresSafeArea()
                    .onTapGesture { withAnimation { isPresented = false } }
                
                // --- 核心布局逻辑 ---
                VStack(spacing: 0) {
                    Spacer() // 把所有东西推到底部
                    
                    // 这是实现悬浮效果的关键 ZStack
                    ZStack(alignment: .top) {
                        
                        // 1. 底层：白色背景板和主要内容
                        VStack(spacing: 0) {
                            // 一个占位符，高度是头部视图的一半
                            // 这就把所有真实内容向下推了
                            Spacer().frame(height: HEADER_VIEW_HEIGHT / 2)
                            
                            // 传入的主要内容
                            sheetContent()
                        }
                        .background(Color(.systemBackground))
                        //.cornerRadius(16, corners: [.topLeft, .topRight])

                        // 2. 顶层：悬浮的头部内容 (我们的图标)
                        headerContent()
                            // 给头部视图一个固定的高度，方便我们计算
                            .frame(height: HEADER_VIEW_HEIGHT)
                    }
                }
                .transition(.move(edge: .bottom))
                .ignoresSafeArea(edges: .bottom)
            }
        }
    }
}

// 更新 View 扩展以接收两个 ViewBuilder
extension View {
    func customBottomSheet<Header: View, Content: View>(
        isPresented: Binding<Bool>,
        @ViewBuilder header: @escaping () -> Header,
        @ViewBuilder content: @escaping () -> Content
    ) -> some View {
        self.modifier(CustomBottomSheetModifier(isPresented: isPresented, headerContent: header, sheetContent: content))
    }
}
 */

import SwiftUI

// 常量保持不变
private let HEADER_VIEW_HEIGHT: CGFloat = 50

struct CustomBottomSheetModifier<SheetContent: View, HeaderContent: View>: ViewModifier {
    
    @Binding var isPresented: Bool
    let headerContent: () -> HeaderContent
    let sheetContent: () -> SheetContent
    
    func body(content: Content) -> some View {
        ZStack {
            content // 主视图
            
            if isPresented {
                Color.black.opacity(0.4)
                    .ignoresSafeArea()
                    .onTapGesture { withAnimation { isPresented = false } }
                
                VStack(spacing: 0) {
                    Spacer() // 把所有东西推到底部
                    
                    // --- 核心布局逻辑修正 ---
                    
                    // 1. 我们先构建基础的白色面板和内容
                    //    注意，我们给它顶部预留了图标一半高度的内边距
                    sheetContent()
                        .padding(.top, HEADER_VIEW_HEIGHT / 2)
                        .background(Color(.systemBackground))
                        .cornerRadius(16, corners: [.topLeft, .topRight])
                    
                    // 2. 然后，使用 .overlay 将头部视图“叠加”上去
                        .overlay(
                            // 使用 VStack 和 Spacer 将内容推到 Vstack 的顶部
                            VStack {
                                headerContent()
                                    .frame(height: HEADER_VIEW_HEIGHT)
                                Spacer()
                            }
                            // 最后，使用 offset 将头部视图向上移动一半的高度
                            // 这让它的中心点，精确地与父视图（白色面板）的顶部边缘对齐
                            .offset(y: -HEADER_VIEW_HEIGHT / 2)
                        )
                }
                .transition(.move(edge: .bottom))
                .ignoresSafeArea(edges: .bottom)
            }
        }
    }
}

// View extension 和 RoundedCorner 辅助工具保持不变
extension View {
    func customBottomSheet<Header: View, Content: View>(
        isPresented: Binding<Bool>,
        @ViewBuilder header: @escaping () -> Header,
        @ViewBuilder content: @escaping () -> Content
    ) -> some View {
        self.modifier(CustomBottomSheetModifier(isPresented: isPresented, headerContent: header, sheetContent: content))
    }
}

extension View {
    func cornerRadius(_ radius: CGFloat, corners: UIRectCorner) -> some View {
        clipShape(RoundedCorner(radius: radius, corners: corners))
    }
}

struct RoundedCorner: Shape {
    var radius: CGFloat = .infinity
    var corners: UIRectCorner = .allCorners

    func path(in rect: CGRect) -> Path {
        let path = UIBezierPath(roundedRect: rect, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        return Path(path.cgPath)
    }
}

#Preview {
    //CustomBottomSheetModifier()
}
